﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UtilZ.Dotnet.Ex.ZLog;

namespace UtilZ.Dotnet.Ex.Communication.Net.Ftp
{
    /// <summary>
    /// 创建目录
    /// Make directory.
    /// </summary>
    internal class FtpMKDCommand : FtpCommandAbs
    {
        /***********************************************************************************************************
        * [MKD]（Make Directory ,创建目录）命令
        * 说明：创建一个在路径名中指定的目录（如果是绝对路径名）或当前工作目录的子目录（如果是相对路径名）。
        * 
        * 用法：MKD<Path><CRLF>
        * 参数：Path是服务器端上的一个有效路径。
        * 例子：
        * SendData "MKD /users/johnsmith" + “/r/n
        * 
        * 返回值如下（粗体表示成功）：
        * 257  “PATHNAME”已创建。
        * 421  服务不可用，关闭控制连接。
        * 
        * 如果某项服务获知自己即将关闭，会向所有命令做出这个应答。
        * 500  语法错误，无法识别命令。这其中包括命令行过长之类的错误。
        * 501  参数或变元中有语法错误。
        * 502  命令还没有被实现。
        * 530  无法登录。
        * 550  请求的操作无法执行，文件不可用（例如找不到文件，无访问权）。
        * 
        ************************************************************************************************************/


        public FtpMKDCommand()
            : base()
        {

        }

        protected override string[] GetNames()
        {
            return new string[] { FtpCommands.MKD };
        }

        protected override IFtpResponse PrimitiveExcute(FtpSession session, string command, string commandLine)
        {
            //Request: MKD 新文件夹
            //Response: 257 "新文件夹" directory created.

            //Response: 550 Access is denied. 

            try
            {
                if (!session.AllowWrite())
                {
                    return new FtpCodeResponse(FtpStatusCodes.Code550, "Access is denied. ");
                }

                string folderName = commandLine;
                if (string.IsNullOrEmpty(folderName))
                {
                    return new FtpCodeResponse(FtpStatusCodes.Code500, "The folder name parameter is required");
                }

                string dir = session.GetLocalPath(folderName);
                Directory.CreateDirectory(dir);
                return new FtpCodeResponse(FtpStatusCodes.Code257, $"\"{folderName}\" directory created.");
            }
            catch (Exception ex)
            {
                return new FtpCodeResponse(FtpStatusCodes.Code451, ex.Message);
            }
        }
    }

}
